home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / UNIX / TREEPAR / PLOTHP.C < prev    next >
C/C++ Source or Header  |  1992-11-23  |  7KB  |  332 lines

  1. /* plotHP.c - plot driver for HPGL
  2.  *
  3.  *  1.Aug.87  jimmc  Initial definition
  4.  * 17.Aug.87  jimmc  Add textsize function
  5.  * 19.Aug.87  jimmc  Simplify text function
  6.  * 20.Aug.87  jimmc  Allow selection of size A,B,C,D
  7.  * 27.Aug.87  jimmc  Remove box function; add size E
  8.  *  1.Sep.87  jimmc  Add R types (rotated)
  9.  * 23.Dec.87  jimmc  Add HPPENNUM env var
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include "plot.h"
  14.  
  15. #define NULL 0
  16. #define DTCHAR '\003'
  17.  
  18. extern char *index(), *getenv();
  19.  
  20. extern char *Progname;
  21.  
  22. static FILE *PHPfile;
  23. static int PHProtated;
  24. static int PHPxtoy, PHPytox;
  25. static int PenIsDown;
  26. static int CurrentX,CurrentY;
  27.  
  28. #define HPGLELEFT    (-20320)
  29. #define HPGLERIGHT    20319
  30. #define HPGLETOP    16255
  31. #define HPGLEBOTTOM    (-16256)
  32.  
  33. #define HPGLDLEFT    (-16256)
  34. #define HPGLDRIGHT    16255
  35. #define HPGLDTOP    10159
  36. #define HPGLDBOTTOM    (-10160)
  37.  
  38. #define HPGLCLEFT    (-10160)
  39. #define HPGLCRIGHT    10159
  40. #define HPGLCTOP    8127
  41. #define HPGLCBOTTOM    (-8128)
  42.  
  43. #define HPGLBLEFT    (-8128)
  44. #define HPGLBRIGHT    8127
  45. #define HPGLBTOP    5079
  46. #define HPGLBBOTTOM    (-5080)
  47.  
  48. #define HPGLALEFT    (-5080)
  49. #define HPGLARIGHT    5079
  50. #define HPGLATOP    4063
  51. #define HPGLABOTTOM    (-4064)
  52.  
  53. static double PHPTextWidth;
  54. static double PHPTextHeight;
  55. static int PHPFontHeight;
  56.  
  57. /* some utility subroutines first */
  58.  
  59. static
  60. penDown()
  61. {
  62.     if (PenIsDown) return;
  63.     fputs("PD;\n", PHPfile);
  64.     PenIsDown++;
  65. }
  66.  
  67. static
  68. penUp()
  69. {
  70.     if (!(PenIsDown)) return;
  71.     fputs("PU;\n", PHPfile);
  72.     PenIsDown = 0;
  73. }
  74.  
  75. /* go somewhere but don't worry about the pen */
  76. static
  77. to(x,y)
  78. int x, y;
  79. {
  80. int newx, newy;
  81.  
  82.     if (x==CurrentX && y==CurrentY) return;
  83.     CurrentX = x;
  84.     CurrentY = y;
  85.     if (PHProtated) {
  86.         newx = PHPytox-y;
  87.         newy = x-PHPxtoy;
  88.         x = newx;
  89.         y = newy;
  90.     }
  91.     fprintf(PHPfile, "PA%d,%d;\n", (x), (y));
  92. }
  93.  
  94. /* get to a particular point with the pen up, but don't issue any pen
  95.  * commands if we are already there */
  96. static
  97. toUp(x,y)
  98. int x, y;
  99. {
  100.     if (x==CurrentX && y==CurrentY) return;
  101.     penUp();
  102.     to(x,y);
  103. }
  104.  
  105. /* get to a particular point with the pen down, but don't issue any pen
  106.  * commands if we are already there */
  107. static
  108. toDown(x,y)
  109. int x, y;
  110. {
  111.     if (x==CurrentX && y==CurrentY) return;
  112.     penDown();
  113.     to(x,y);
  114. }
  115.  
  116. /* externally callable routines */
  117.  
  118. int PHPAInit(filename,lxp,lyp,hxp,hyp)
  119. char *filename;
  120. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  121. {
  122.     return PHPxInit(filename,lxp,lyp,hxp,hyp,
  123.         HPGLALEFT,HPGLABOTTOM,HPGLARIGHT,HPGLATOP);
  124. }
  125.  
  126. int PHPBInit(filename,lxp,lyp,hxp,hyp)
  127. char *filename;
  128. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  129. {
  130.     return PHPxInit(filename,lxp,lyp,hxp,hyp,
  131.         HPGLBLEFT,HPGLBBOTTOM,HPGLBRIGHT,HPGLBTOP);
  132. }
  133.  
  134. int PHPCInit(filename,lxp,lyp,hxp,hyp)
  135. char *filename;
  136. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  137. {
  138.     return PHPxInit(filename,lxp,lyp,hxp,hyp,
  139.         HPGLCLEFT,HPGLCBOTTOM,HPGLCRIGHT,HPGLCTOP);
  140. }
  141.  
  142. int PHPDInit(filename,lxp,lyp,hxp,hyp)
  143. char *filename;
  144. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  145. {
  146.     return PHPxInit(filename,lxp,lyp,hxp,hyp,
  147.         HPGLDLEFT,HPGLDBOTTOM,HPGLDRIGHT,HPGLDTOP);
  148. }
  149.  
  150. int PHPEInit(filename,lxp,lyp,hxp,hyp)
  151. char *filename;
  152. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  153. {
  154.     return PHPxInit(filename,lxp,lyp,hxp,hyp,
  155.         HPGLELEFT,HPGLEBOTTOM,HPGLERIGHT,HPGLETOP);
  156. }
  157.  
  158. int PHPARInit(filename,lxp,lyp,hxp,hyp)
  159. char *filename;
  160. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  161. {
  162.     return PHPyInit(filename,lxp,lyp,hxp,hyp,
  163.         HPGLALEFT,HPGLABOTTOM,HPGLARIGHT,HPGLATOP);
  164. }
  165.  
  166. int PHPBRInit(filename,lxp,lyp,hxp,hyp)
  167. char *filename;
  168. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  169. {
  170.     return PHPyInit(filename,lxp,lyp,hxp,hyp,
  171.         HPGLBLEFT,HPGLBBOTTOM,HPGLBRIGHT,HPGLBTOP);
  172. }
  173.  
  174. int PHPCRInit(filename,lxp,lyp,hxp,hyp)
  175. char *filename;
  176. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  177. {
  178.     return PHPyInit(filename,lxp,lyp,hxp,hyp,
  179.         HPGLCLEFT,HPGLCBOTTOM,HPGLCRIGHT,HPGLCTOP);
  180. }
  181.  
  182. int PHPDRInit(filename,lxp,lyp,hxp,hyp)
  183. char *filename;
  184. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  185. {
  186.     return PHPyInit(filename,lxp,lyp,hxp,hyp,
  187.         HPGLDLEFT,HPGLDBOTTOM,HPGLDRIGHT,HPGLDTOP);
  188. }
  189.  
  190. int PHPERInit(filename,lxp,lyp,hxp,hyp)
  191. char *filename;
  192. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  193. {
  194.     return PHPyInit(filename,lxp,lyp,hxp,hyp,
  195.         HPGLELEFT,HPGLEBOTTOM,HPGLERIGHT,HPGLETOP);
  196. }
  197.  
  198. static int        /* 1 if OK */
  199. PHPxInit(filename,lxp,lyp,hxp,hyp,left,bottom,right,top)
  200. char *filename;
  201. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  202. int left,bottom,right,top;
  203. {
  204.     return PHPnInit(filename,lxp,lyp,hxp,hyp,left,bottom,right,top,0);
  205. }
  206.  
  207. static int        /* 1 if OK */
  208. PHPyInit(filename,lxp,lyp,hxp,hyp,left,bottom,right,top)
  209. char *filename;
  210. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  211. int left,bottom,right,top;
  212. {
  213.     return PHPnInit(filename,lxp,lyp,hxp,hyp,left,bottom,right,top,1);
  214. }
  215.  
  216. static int        /* 1 if OK */
  217. PHPnInit(filename,lxp,lyp,hxp,hyp,left,bottom,right,top,rotated)
  218. char *filename;
  219. int *lxp,*lyp,*hxp,*hyp;    /* returns bounding box of window */
  220. int left,bottom,right,top;
  221. int rotated;
  222. {
  223. char *pn;
  224.  
  225.     if (strcmp(filename,"stdout")==0) PHPfile=stdout;
  226.     else if (strcmp(filename,"stderr")==0) PHPfile=stderr;
  227.     else PHPfile = fopen(filename,"w");
  228.     if (!PHPfile) {
  229.         printf("can't open file %s",filename);
  230.         return 0;
  231.     }
  232.     fprintf(PHPfile,"IN;PA;\n");
  233.     fprintf(PHPfile,"\033.I;0;17:\n\033.N;19:\n");    /* init handshake */
  234.     fprintf(PHPfile,"IP %d,%d,%d,%d;\n",
  235.         left,bottom,right,top);
  236.         /* make it square */
  237.     fprintf(PHPfile,"SC %d,%d,%d,%d;\n",
  238.         left,right,bottom,top);
  239.     fprintf(PHPfile,"PU;PA0,0;\n");    /* go to origin */
  240.     pn = getenv("HPPENNUM");
  241.     if (!pn) pn = "1";
  242.     fprintf(PHPfile,"SP%s;\n",pn);
  243.     if (rotated) {
  244.         fprintf(PHPfile,"DI0,1;\n");    /* rotate the text */
  245.         PHProtated = 1;
  246.         *lxp = bottom;    /* x and y sizes are swapped */
  247.         *lyp = left;
  248.         *hxp = top;
  249.         *hyp = right;
  250.         PHPytox = right+left;
  251.         PHPxtoy = bottom+top;
  252.     }
  253.     else {
  254.         PHProtated = 0;
  255.         *lxp = left;
  256.         *lyp = bottom;
  257.         *hxp = right;
  258.         *hyp = top;
  259.     }
  260.     return 1;
  261. }
  262.  
  263. PHPDone()
  264. {
  265.     fprintf(PHPfile,"IW;PU;SP0;PA0,0;\n");
  266.     fprintf(PHPfile,"NR;\n");
  267.     if (PHPfile!=stdout && PHPfile!=stderr)
  268.         fclose(PHPfile);
  269. }
  270.  
  271. PHPTextSize(x,y)
  272. int x,y;
  273. {
  274.     PHPFontHeight = y;
  275.     PHPTextHeight = 0.0017 * (double)y;
  276.     PHPTextWidth = 0.0017 * (double)x;
  277.     fprintf(PHPfile,"SI%g,%g;\n",PHPTextWidth,PHPTextHeight);
  278.             /* text size */
  279. }
  280.  
  281. PHPLine(lx,ly,hx,hy)
  282. int lx,ly,hx,hy;
  283. {
  284.     if (CurrentX==hx && CurrentY==hy) {
  285.         toDown(lx,ly);
  286.     }
  287.     else {
  288.         toUp(lx,ly);
  289.         toDown(hx,hy);
  290.     }
  291. }
  292.  
  293. PHPText(x,y,text)
  294. int x,y;    /* lower left corner of text */
  295. char *text;
  296. {
  297.     toUp(x,y);
  298.     fprintf(PHPfile,"LB%s%c\n",text,DTCHAR);
  299. }
  300.  
  301. PHPSetup()
  302. {
  303.     PHPxSetup("HPA",PHPAInit);
  304.     PHPxSetup("HPB",PHPBInit);
  305.     PHPxSetup("HPC",PHPCInit);
  306.     PHPxSetup("HPD",PHPDInit);
  307.     PHPxSetup("HPE",PHPEInit);
  308.     PHPxSetup("HPAR",PHPARInit);
  309.     PHPxSetup("HPBR",PHPBRInit);
  310.     PHPxSetup("HPCR",PHPCRInit);
  311.     PHPxSetup("HPDR",PHPDRInit);
  312.     PHPxSetup("HPER",PHPERInit);
  313. }
  314.  
  315. static
  316. PHPxSetup(name,init)
  317. char *name;
  318. int (*init)();
  319. {
  320. PDevInfo *p;
  321.  
  322.     p = Pnew();
  323.     p->name = name;
  324.     p->init = init;
  325.     p->done = PHPDone;
  326.     p->line = PHPLine;
  327.     p->text = PHPText;
  328.     p->textsize = PHPTextSize;
  329. }
  330.  
  331. /* end */
  332.